import {
	orderQuery as queryReportApi,
	orderByTimeQuery
} from "@/api/common";
import {
	ref,
	unref
} from 'vue'
import {
	concat
} from 'lodash'
import {
	showToast
} from "@/utils/toast";

/**
 * 报表查询Hook
 * @param {Number} params.id 报表ID
 * @param {Array} params.conditions 查询条件
 * @param {Number} params.page 页码
 * @param {Number} params.size 每页条数
 * @param {Array} params.sorts 排序条件
 * @param {Array} params.groupBys 分组条件
 * @param {Boolean} params.isShowChannel 是否返回渠道
 * @param {Array} params.columns 字段
 * @param {Function} conditionFn 构建查询条件的方法
 * @returns 
 */
const useList = function(params, conditionFn, immediately = true, transferFn) {
	// 总数
	let total = ref(0)
	// 报表数据
	let dataSource = ref([])
	// 是否没有更多数据
	let isNoMoreData = ref(false)
	// 是否请求中
	let isRefreshing = ref(false)

	// 查询报表
	function queryReport(isUpdate) {
		// 组装查询条件
		// params.value.conditions = conditionFn()

		orderByTimeQuery(unref(params)).then((res) => {
			// 刷新当前页数据时截取截至当前页的数据，然后重新组装
			if (isUpdate) {
				dataSource.value = dataSource.value.splice(0, params.value.size * (params.value.page - 1))
			}

			// 查询结果赋值
			if (transferFn) {
				// 需要对报表数据处理时，避免使用watch，一旦数据的值进行变动，将会触发watch
				const data = transferFn(res)
				dataSource.value = concat(dataSource.value, data);
			} else {
				dataSource.value = concat(dataSource.value, res);
			}
			total.value = res.size

			// 判断是否没有更多数据
			if (params.value.size * params.value.page >= total.value) {
				isNoMoreData.value = true
			}
		}).catch(() => {
			isRefreshing.value = false;
		});
	}

	// 刷新报表数据
	function refresh() {
		// 重置相关数据
		isRefreshing.value = true;
		total.value = 0
		dataSource.value = []
		isNoMoreData.value = false
		params.value.page = 1

		// 请求报表数据
		queryReport()
	}

	// 加载下一页数据
	function loadMore() {
		if (isNoMoreData.value) {
			showToast('没有更多数据')
		} else {
			params.value.page++
			queryReport()
		}
	}

	// 注册后立即执行一次报表查询
	if (immediately) {
		queryReport()
	}

	return [{
		dataSource,
		total,
		isRefreshing
	}, {
		queryReport,
		refresh,
		loadMore
	}]
}

export default useList